#include "selectionsort.h"

// 构造函数：将输入的值包装为 SortBar 并初始化相关索引
SelectionSort::SelectionSort(const QVector<int> &values) {
    for (int v : values)
        bars.append({v, Qt::lightGray}); // 初始颜色为灰色
    i = 0;                  // 外层循环索引初始化为 0
    j = i + 1;              // 内层扫描从 i+1 开始
    minIndex = i;           // 初始最小值下标设为 i
}

// 每次调用执行排序的一小步
void SelectionSort::step() {
    // 如果排序已经完成或外层已到末尾，标记为完成
    if (sorted || i >= bars.size() - 1) {
        sorted = true;
        return;
    }

    // 每步先重置颜色
    for (auto &bar : bars) bar.color = Qt::lightGray;

    // 设置当前比较状态的颜色：
    bars[i].color = Qt::darkBlue;     // 当前外层元素
    bars[j].color = Qt::red;          // 当前内层比较元素
    bars[minIndex].color = Qt::green; // 当前找到的最小值

    compareCount++;

    // 根据排序顺序更新 minIndex
    if ((sortOrder == SortOrder::Ascending && bars[j].value < bars[minIndex].value) ||
        (sortOrder == SortOrder::Descending && bars[j].value > bars[minIndex].value)) {
        minIndex = j;
    }

    j++; // 内层扫描继续

    // 如果内层循环结束
    if (j >= bars.size()) {
        // 若 minIndex 不是当前 i，执行交换
        if (minIndex != i) {
            std::swap(bars[i], bars[minIndex]);
            swapCount++;
        }

        // 外层推进到下一个元素
        i++;
        j = i + 1;
        minIndex = i;
    }
}

// 判断排序是否已完成
bool SelectionSort::isFinished() const { return sorted; }

// 获取当前用于可视化的数组数据
const QVector<SortBar>& SelectionSort::getData() const { return bars; }

// 返回当前步的比较次数并清零
int SelectionSort::getAndResetCompareCount() {
    int c = compareCount;
    compareCount = 0;
    return c;
}

// 返回当前步的交换次数并清零
int SelectionSort::getAndResetSwapCount() {
    int s = swapCount;
    swapCount = 0;
    return s;
}

// 返回算法的时间与空间复杂度描述
QString SelectionSort::getComplexityInfo() const {
    return "平均 O(n²)，最好 O(n²)，最坏 O(n²)，空间复杂度 O(1)";
}

// 设置排序顺序（升序/降序）
void SelectionSort::setOrder(SortOrder order) {
    sortOrder = order;
}
